<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>借用原型</title>
</head>
<body>
    <button message='后盾人' class="red">后盾人</button>
    <button message='hdcms' class="green">hdcms</button>
</body>
</html>
<script>
    /*let hd = {
        data : [1,2,3,4,5]
    };
    //设置hd的原型为 {}
    //既然设置了hd的原型  那么hd原型上面的所有的方法都是可以使用的
    Object.setPrototypeOf(hd,{
        //获取最大值
        max:function(){
            return this.data.sort((a,b) => b -a)[0];
        }
    });
    // console.log(hd.max());


    let xj = {
        lessons : {js:100,php:78,node:78,linux:125},
        get data(){
            //获取对象中的值 最终返回的是一个数组
            return Object.values(this.lessons);
        }
    };
    //apply用于改变this指针  apply必须用于方法之后
    console.log(hd.__proto__.max.apply(xj))
    */

    /*
    //如果以上的max中可以传递参数  就可以不用在对象中定义 getter方法了
    let hd = {
        data : [1,2,3,4,5,6,78]
    };
    //因为hd本身是没有获取最大值的方法的，所以给hd对象重新设置原型
    Object.setPrototypeOf(hd,{
        max:function(data){
            return data.sort((a,b) => {
                return b -a;
            })[0];
        }
    });
    //获取hd中的最大值
    // console.log(hd.max(hd.data));

    let xj = {
        lessons : {js :100 , php:78 ,node:76,linux : 151}
    };
    console.log(hd.__proto__.max.call(xj,Object.values(xj.lessons)))
    */

    /*
    //因为Math.max 就是获取最大值的方法，所以代码可以再次优化
    let hd = {
        data : [1,2,3,4,5]
    };

    // console.log(Math.max(...hd.data));
    //使用call 后面的参数不能是数组
    // console.log(Math.max.call(this,...Object.values(hd.data)));
    // console.log(Object.values(hd.data));
    //如果是使用apply 后面第二个参数必须是数组
    //如果当前对象没有这个方法   可以借用别人的方法
    let xj = {
        lessons : {js :100 , php:78 ,node:76,linux : 151}
    };


    console.log(Math.max.apply(xj,Object.values(xj.lessons)));

    */


    //获取设置了class属性的按钮  但是DOM节点不能直接使用过滤 filter方法  但是可以借用数组的原型方法


    // let btns = document.querySelectorAll("[class='red']");
    //当前的对象没有某个方法的时候  可以向别的对象借取   左邻右舍
    // let btns = document.querySelectorAll("button");
    // //call不能传递数组
    // btns = (Array.prototype.filter.call(btns,item => {
    //     return item.hasAttribute('class') && item.getAttribute('class') == 'green';
    // }));
    // console.log(btns)


    //this
    //this不受原型继承影响  this指向调用属性时候使用的对象
    let hd = {
        name : "后盾人",
    };

    let houdunren = {
        name : "向军",
        show(){
            return this.name;
        }
    };

    hd.__proto__ = houdunren;
    console.log(hd.show())




</script>